﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Google.API.Translate;
//using GoogleTranslationAPI;
using System.Net;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;
using System.Web;

using Translate;

using GooLanguage = Google.API.Translate.Language;
using LanguageTr = Translate.Language;
//using AlexTranslator.ProLing;
using DotNetWikiBot;
using System.Runtime.InteropServices;
using System.Threading;
using System.IO;
using System.Diagnostics;
using System.Collections.Specialized;
//using Google.API.Search;
//using lib5;
//using java.lang;



namespace AlexTranslator
{
    using boolean = System.Boolean;
    
    using System.Xml.Serialization;
    
    using DiffPlex.DiffBuilder;
    using DiffPlex;
using DiffPlex.DiffBuilder.Model;
    using DiffMatchPatch;
    using DiffPlex.Model;
    using ulif;
    using Google.Apis.Translate.v2;
    
    //using Google.API;



    public partial class MainForm : WikiWinForm
    {        
        public static string baseFolder = AppDomain.CurrentDomain.BaseDirectory;
        public readonly string configFolder = baseFolder + @"Config\";
        public readonly string statFolder = baseFolder + @"stat\";

        public MainForm()
        {
         //ThreadStart   
            ((Action)delegate
            {
                Site s = RuSite;
            }).BeginInvoke(null, null);

            ((Action)delegate
            {
                Site s = UkSite;
            }).BeginInvoke(null, null);

            InitializeComponent();
        }



        private void Form1_Load(object sender, EventArgs e)
        {            
            this.Closing += new CancelEventHandler(MainForm_Closing);
            //File.AppendAllText("TranslationTime.txt", string.Format("фигня was translated in \n"), Encoding.Unicode);
            

            rbSrc.Text = @"[[Файл:Tambora volc.jpg|thumb|Космический снимок вулкана Тамбора]]
{{distinguish|Культура Тамбора}}
'''Тамбора''' (''Tambora'', {{coor|8|15|S|118|0|E|type:mountain_region:ID}}) — [[стратовулкан]] в [[Индонезия|Индонезии]] на острове [[Сумбава]] (''Sumbawa''). 

[[Korean Air | Korean Air Lines]]
[[метр]]ов
[[ветер]]очек


Извержение этого [[Вулкан (геология)|вулкана]] в [[1815]] — крупнейшее за всю современную историю по объёму изверженного материала (до 150—180 куб. км. пирокластики и газов), количеству человеческих жертв (непосредственно при извержении погибло около 10000 человек, от 50000 до 80000 умерло от голода и болезней вследствие извержения) и глобальному воздействию на климат Земли, единственное историческое извержение с коэффициентом эксплозивности 7. В результате извержения была полностью уничтожена развитая [[культура Тамбора]], длительное время существовавшая на острове. Последним извержением, сопоставимым или превосходившим по силе извержение Тамборы, по оценкам геологов, было извержение вулкана в Новой Зеландии около 27 тыс. лет назад, в результате которого образовалось озеро [[Таупо (озеро)|Таупо]].

Извержение началось [[5 апреля]] [[1815]] и продолжалось примерно до [[15 апреля]]. По общей энергии извержение превосходило извержение [[Кракатау]] 1883 года (однако мощность эксплозий уступала по мощности пароксизмальному взрыву Кракатау. Энергия извержения оценивается величиной порядка 10 ^19 [[джоуль|Дж]] (энергия извержения вулкана [[Безымянный (вулкан)|Безымянный]] 30 марта 1956 оценивается величиной порядка 10^17 Дж). Было выброшено около 1.4×10<sup>14</sup> кг пирокластического материала, в результате извержения образовалась [[кальдера]] диаметром 6.5-7 км и глубиной до 700 м. До извержения Тамбора имел высоту около {{nobr|4200 м}}, после извержения приблизительно {{nobr|2850 м}}.

Выброшенные в воздух огромные массы вулканического пепла в течение трёх суток скрывали от солнечного света территорию в радиусе до 500 км от вулкана. По свидетельству представителя британских властей в Индонезии, во мраке нельзя было разглядеть ничего даже на расстоянии вытянутой руки.

Бо́льшая часть острова Сумбава, площадь которого превышает 13 000 км², была покрыта слоем пепла более 1 м толщиной. Под его тяжестью разваливались даже каменные постройки. На острове из более чем 10 тысячного населения осталось в живых 29 человек. Соседний остров Ломбок был засыпан слоем пепла в 60 см на расстоянии 150—200 км от вулкана. Под пеплом, а также от голода (в связи с гибелью урожая и кормов для скота) здесь погибло 44 тыс. человек. Пепел залетал в Батавию (на 1300 км от вулкана) и на остров [[Сулавеси]].

Пемза на огромные расстояния покрывала океан, препятствуя движению кораблей.

Последствия извержения затронули [[Молуккские острова]], [[Ява (остров)|остров Ява]], частично [[Сулавеси]], [[Суматра|Суматру]] и [[Борнео]].

В [[1816 год]]у из-за выброса пыли и газов при извержении в Северной Европе и на востоке Северной Америки летом установились небывало низкие температуры(«[[Год без лета]]»). Зимний снег сошел только в июне, а в августе начались заморозки. Результатом этого стали неурожаи и голод.

Извержения Тамбора несравненно меньшей силы происходили в 1847 и 1913 гг. Ныне вулкан находится в сольфатарной стадии. Склоны вулкана покрыты растительностью. На дне огромной кальдеры — озеро дождевого происхождения. В [[2004]] были начаты археологические раскопки поселений, погребённых под слоем пепла.

== Ссылки ==
* [http://www.physorg.com/news11256.html Об археологических раскопках (англ.)]
* [http://science.compulenta.ru/news/255366/ Об археологических раскопках]
{{Link FA|en}}
{{Link FA|en}}

{{Link FA|id}}

[[Категория:Вулканы по алфавиту]]
[[Категория:Вулканы Индонезии]]
[[Категория:Стратовулканы]]
[[Категория:Извержения вулканов]]
[[Категория:Апрель 1815 года]]
[[Категория:1815 год в Индонезии]]
[[Категория:Стихийные бедствия в Индонезии]]
";

            /*rbSrc.Text = @"Извержение,
 этого,
 крупнейшее,
 за всю современную,
 историю по объёму изверженного материала ";
            */
            //CheckWordComparing();
            //CheckTwoLanguagesTranslation();
            //CompareTextLenght();
            
            //TestTextLength();

            //LinksReplacingAndBackReplacingTest();
             

            //TestEffectOfTranslationWithLinksReplacing();

            /*string src = File.ReadAllText(@"G:\proj\Translators\MyTranslator\MyTranslator\bin\Debug\TranslationPairs\ru_Инцидент с южнокорейским Боингом (1983).txt");
            rbSrc.Text = src;
            Translate();
            */

            //TestTwoReplacions(rbSrc.Text);
            //UlifTest();

            rbSrc.Text = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "cfg_text.txt");

            //GetSynonymsPage("держава");
            //GetWordsWithRod();
            CheckWordComparing(); //good

            //string yandex = TranslationTools.YandexTranslatePost("привет!!! я- хочу перевести этот текст","ru","uk");

            //rbDstPere.Text = yandex;
        }

        void MainForm_Closing(object sender, CancelEventArgs e)
        {
            File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + "cfg_text.txt",rbSrc.Text);
            //throw new NotImplementedException();
        }

        private void LinksReplacingAndBackReplacingTest()
        {
            rbSrc.Text = File.ReadAllText(@"G:\proj\Translators\MyTranslator\MyTranslator\bin\Debug\TranslationPairs\ru_Инцидент с южнокорейским Боингом (1983).txt");
            rbSrc.Text = TextTools.ExpandLinkText(rbSrc.Text);
            //rbSrc.Text = TextUtils.ExpandLinkText(rbSrc.Text);
            rbDst.Text = TextTools.ReplaceLinksWithText(rbSrc.Text);
            rbDstPere.Text = TextTools.BackReplacementLinksWithText(rbDst.Text);
            SelectDifferentWords(rbSrc.Text, rbDstPere.Text, rbDstPere);
        }

        public void TestTworeplacements(string text)
        {
            text = TextTools.ReplaceLinksWithText(text);
            string txt2 = TextTools.ReplaceLinksWithText(text);
            if (txt2 != text)
                MessageBox.Show("Bad REplacemnt. Algorithm failed");
            else
                MessageBox.Show("Yeah!");

        }

        


        
        /*
        private static void TestTextLength()
        {
            Google.API.Translate.TranslateClient client = new TranslateClient(@"http://code.google.com/p/google-api-for-dotnet/");

            int maxLength = 1989;// int maxLength = 1989; - this is it! the longes lenght of symbols
            string longString = new string('w', maxLength);

            for (int i = 0; i < 500; i++)
            {
                longString += "b";

                Logger.Write("i=" + i + ";strlen=" + longString.Length + longString);
                //Logger.Write();
                string translatedBlock = 
                    client.Translate(
                    longString, GooLanguage.Russian, GooLanguage.Ukrainian, TranslateFormat.Text);
                
            }
        }
        */

        void CompareTextLenght()
        {
            rbSrc.Text = File.ReadAllText(@"TranslationPairs\ru_Авиакатастрофа над Персидским заливом 3 июля 1988.txt");
            rbDst.Text = File.ReadAllText(@"TranslationPairs\ukr_Авиакатастрофа над Персидским заливом 3 июля 1988.txt");
            int pos = 5000;
            SendMessage(rbDst.Handle, WM_VSCROLL, (pos << 16) | SB_THUMBPOSITION, IntPtr.Zero);
            //SendMessage(rbSrc.Handle, WM_VSCROLL, (pos << 16) | SB_THUMBPOSITION, IntPtr.Zero);
            
        }        


        

        

        public void LoadPage()
        {

            //TestRedLinks();

            txbSrcPage.Text = HttpUtility.UrlDecode(txbSrcPage.Text);
            string[] strings = txbSrcPage.Text.Split(new char[] { '/' });
            if (strings.Length > 0)
            {
                txbSrcPage.Text = strings[strings.Length - 1];
                txbSrcPage.Text = txbSrcPage.Text.Replace('_', ' ');
            }

            Page p = new Page(RuSite,txbSrcPage.Text );
            p.Load();
            string[] links = p.GetInterWikiLinks(false);
            string englishLink = links.FirstOrDefault<string>(l=>l.Contains("en:"));
            //links.Select<string>(m=>m.Contains("en:"));

            p.GetLinks();
            p.RemoveInterWikiLinks();            
            
            string[] links2 = { englishLink };
            p.AddInterWikiLinks(links2);            

            //p.ReviseInMSWord();
            
            rbSrc.Text = p.text;
            //p.GetLinks

            txbDstPage.Text = TranslationTools.GoogleTranslate(p.title, "ru", "uk");
            string translatedPageName = txbDstPage.Text.Trim();
            txbDstPage.Text = //"Користувач:Alex Blokha/" + 
                translatedPageName;

            ThreadStart ts =  delegate
            {
                FindSimilarArticles(translatedPageName);
            };
            ts.BeginInvoke(null,null);

            
            MsTranslator.LanguageServiceClient client = new MsTranslator.LanguageServiceClient();
            //client.AddTranslation(


        }

        private void FindSimilarArticles(string articleTitle)
        {
            if (string.IsNullOrEmpty(articleTitle))
            {
                txbDstPage.Text = TranslationTools.GoogleTranslate(txbSrcPage.Text, "ru", "uk");
                articleTitle = txbDstPage.Text;

                if (string.IsNullOrEmpty(articleTitle))
                {
                    return;
                }
            }
            
            
            PageList pl2 = new PageList(UkSite);

            pl2.FillFromGoogleSearchResults(articleTitle, 10);
            
            

            lblWarning.Invoke((Action)delegate
            {
                lblWarning.Visible = false;
                rbSimilarArticles.Text = "(" + pl2.Count() + ")";
            });
            lblWarning.Invoke((Action)delegate
            {
                foreach (Page page in pl2)
                {


                    rbSimilarArticles.Text += HttpUtility.HtmlDecode(page.title) + "\r\n";
                    if (articleTitle.Replace(",", "") == page.title)
                    {
                        lblWarning.Visible = true;
                        lblWarning.Text = page.title;
                    }

                }
                string[] words = articleTitle.Split(new char[] { ' ',',','.' });
                foreach( string word in words)
                {
                    if (rbSimilarArticles.Text.Contains(word))
                    {
                        rbSimilarArticles.Select(
                            rbSimilarArticles.Text.IndexOf(word),
                            word.Length);
                        rbSimilarArticles.SelectionBackColor = Color.Red;
                    }
                }
            
            }
            );
        }

        

        bool replaceLinksWithText = true;

        

        public void Translate()            
        {            

            rbSrc.Text = TextTools.ExpandLinkText(rbSrc.Text);
            if (replaceLinksWithText)
            {
                rbSrc.Text = TextTools.ReplaceLinksWithText(rbSrc.Text);
            }

            string initialSrc = rbSrc.Text;
            string src = initialSrc;
            
            string gooResult ="";
            BackgroundWorker bgg = new BackgroundWorker();
            bgg.DoWork += delegate(object sender, DoWorkEventArgs e)
            {
                try
                {
                    gooResult = TranslationTools.WikiGoogleTranslate(src, 
                        GooLanguage.Unknown, GooLanguage.Ukrainian, true);
                    //gooResult = TranslationTools.WikiYandexTranslate(src);
                    
                    
                }
                catch (System.Exception ex)
                {
                    if (ex.Message.Contains("400"))
                    {
                        gooResult = TranslationTools.WikiGoogleTranslate(src, GooLanguage.Russian, GooLanguage.Ukrainian, true);

                    }
                    else
                        throw;
                }

                e.Result = gooResult;
            };
            bgg.RunWorkerAsync();

            string pereResult="";
            BackgroundWorker bg = new BackgroundWorker();
            bg.DoWork += delegate(object sender, DoWorkEventArgs e)
            {
                pereResult =
                    TranslationTools.WikiYandexTranslate(src);
                    //TranslationTools.WikiPereTranslate(initialSrc, 
                //new LanguagePair(LanguageTr.Russian, LanguageTr.Ukrainian));
                
            e.Result = pereResult;
            };
            bg.RunWorkerAsync();


            for (; bg.IsBusy || bgg.IsBusy; )
            {   
                Application.DoEvents();
                System.Threading.Thread.Sleep(500);
                Application.DoEvents();            
            }
            
            /*
                rbDst.ResetText();
                rbBackTransform.ResetText();
             */ //causes problems with locale switching

                rbDstPere.ResetText();
                rbDstPere.DeselectAll();

                rbDst.ResetText();
                rbDst.DeselectAll();

            rbDst.Text = gooResult;
            rbDstPere.Text = pereResult;
            gooResult = MarkDelimitations();

            DiffTwo();
            SelectUntranslated();
            CalculateSizeAndRatio();
            rbDst.Select(0, 0);
            rbDst.SelectedText = "{{В роботі}}\n";
        }

        private void DiffTwo()
        {
            

            Diff_Plex();
            //DiffOld();
            //Diff(rbDst.Text, rbDstPere.Text, rbDst);
            //Diff(rbDstPere.Text, rbDst.Text, rbDstPere);
        }
        private void Diff(string text1, string text2, RichTextBox controlToSelect)
        {
            DiffGoogle(text1, text2, controlToSelect);
        }        

        private void DiffGoogle(string text1, string text2, RichTextBox controlToSelect)
        {
            diff_match_patch d = new diff_match_patch();
            var list = d.diff_main(text1, text2,true);
            d.diff_cleanupSemanticLossless(list);           

            int wordStart = 0;
            foreach (Diff diff in list)
            {
                if (diff.operation == Operation.DELETE)
                {
                    controlToSelect.Select(wordStart,
                           diff.text.Length);
                    controlToSelect.SelectionBackColor = Color.Yellow;
                }

                if (diff.operation == Operation.DELETE || diff.operation == Operation.EQUAL)
                {
                    wordStart += diff.text.Length;
                }
            }
        }

        private void Diff_Plex()
        {
            RichTextBox controlToSelect = rbDst;
            controlToSelect.Select(0,
                            10);
            controlToSelect.SelectionBackColor = Color.White;

            /*
            Differ d = new Differ();

            DiffResult diffResult = d.CreateWordDiffs(rbDst.Text, rbDstPere.Text, true, SideBySideDiffBuilder.WordSeparaters);

            string res = diffResult.PiecesNew.Aggregate((i, j) => i + j);
            //items.Aggregate((i, j) => i + delimeter + j)

            foreach (DiffBlock diff in diffResult.DiffBlocks)
            {
                if (diff.DeleteCountA >0 )// == Operation.DELETE)
                {
                    controlToSelect.Select(diff.DeleteStartA,
                           diff.DeleteCountA);
                    controlToSelect.SelectionBackColor = Color.Yellow;
                }                
            }
            */

            Differ d = new Differ();

            
            
            SideBySideDiffBuilder differ = new SideBySideDiffBuilder(d);
            string leftContent = rbDst.Text;
            string rightContent = rbDstPere.Text;
            
            
            SideBySideDiffModel diffRes = differ.BuildDiffModel(leftContent, rightContent);

            RenderDiffLines(rbDst, diffRes.OldText);
            //RenderDiffLines(rbDstPere, diffRes.NewText);
            
        }

        private void RenderDiffLines(RichTextBox textBox, DiffPaneModel diffModel)
        {
            int charPos = 0;
            int charPosOffset = 0;
            //ClearDiffLines(grid);


            var lineNumber = 0;
            foreach (var line in diffModel.Lines)
            {
                var fillColor = (Color.Transparent);
                if (line.Type == ChangeType.Deleted)
                    fillColor = (Color.FromArgb(255, 255, 200, 100));
                else if (line.Type == ChangeType.Inserted)
                    fillColor = (Color.FromArgb(255, 255, 255, 0));
                else if (line.Type == ChangeType.Unchanged)
                    fillColor = (Color.White);
                else if (line.Type == ChangeType.Modified)
                {
                    //if (currentFont.IsMonoSpaced)
                        RenderDiffWords( textBox, line, lineNumber, ref charPos,charPosOffset);
                    fillColor = (Color.FromArgb(255, 220, 220, 255));
                }
                else if (line.Type == ChangeType.Imaginary)
                {
                    //fillColor = new SolidColorBrush(Color.FromArgb(255, 200, 200, 200));

                    //AddImaginaryLine(textBox, lineNumber);
                }
                /*
                if (ShowVisualAids)
                {
                    if (lineNumber % 2 == 0)
                        fillColor = new SolidColorBrush(Colors.Cyan);
                    else
                    {
                        fillColor = new SolidColorBrush(Colors.Gray);
                    }
                }
                */

                //PlaceRectangleInGrid(textBox, grid, lineNumber, fillColor, 0, null);
                var controlToSelect = textBox;
                //controlToSelect.Select((int)line.Position,
                //            line.Text.Length);
                //controlToSelect.SelectionBackColor = fillColor;

                lineNumber++;
                if (line.Text != null)
                {
                    charPosOffset += line.Text.Length;
                    charPosOffset++;
                }
                
                //charPos++; 

            }
        }
        
        private void RenderDiffWords(RichTextBox textBox, DiffPiece line, int lineNumber, ref int charPos, int charPosOffset)
        {
            charPos = charPosOffset;
            //var characterWidth = CharacterWidthOverride ?? currentFont.CharacterWidth;
            //var leftOffset = LeftOffsetOverride ?? currentFont.LeftOffset;
            foreach (var word in line.SubPieces)
            {
                Color fillColor;
                if (word.Type == ChangeType.Deleted)
                    fillColor = (Color.Yellow);
                else if (word.Type == ChangeType.Inserted)
                    fillColor = (Color.Green);
                else if (word.Type == ChangeType.Imaginary)
                    continue;
                else
                    fillColor = (Color.Blue);

                //var left = characterWidth * charPos + leftOffset;
                //var wordWidth = characterWidth * word.Text.Length;
                //PlaceRectangleInGrid(textBox, grid, lineNumber, fillColor, left, wordWidth);

                if (word.Type == ChangeType.Deleted )
                {
                    if (!(word.Text.Length < 3 && word.Text.Trim(SideBySideDiffBuilder.WordSeparaters).Length == 0))
                    {
                        if (!string.IsNullOrEmpty(word.Text.Trim()))
                        {
                            var controlToSelect = textBox;
                            controlToSelect.Select((int)charPos,
                                        word.Text.TrimEnd(new char[] {
                                            ' ', ':', '»', '.' }).Length);
                            controlToSelect.SelectionBackColor = fillColor;
                        }

                        if (word.Text.Length < 3)
                            Console.WriteLine();
                    }

                    
                    
                }
                if (word.Type == ChangeType.Deleted || 
                    word.Type == ChangeType.Unchanged
                    //|| word.Type == ChangeType.Modified
                    /*
                    || word.Type == ChangeType.Imaginary
                    || word.Type == ChangeType.Modified
                    || word.Type == ChangeType.Inserted
                    */
                    )
                {
                    charPos += word.Text.Length;
                }

                
            }
        }
        
        private void DiffOld()
        {
            SelectDifferentWords(rbDstPere.Text, rbDst.Text, rbDst);
            SelectDifferentWords(rbDst.Text, rbDstPere.Text, rbDstPere);
        }

        private void SelectUntranslated()
        {
            List<string> regexes = new List<string>();
            regexes.Add(@"\w*ск(\w{1,3})"); //posadskiy, posadskoho
            //regexes.Add(@"\w*ск(ій|ого|ому|ім|ом)"); //posadskiy, posadskoho
            //regexes.Add(@"\w*sk(iy|oho|omu|im|om)"); //posadskiy, posadskoho
            //posadskomu, posadskim, posadskom
            //regexes.Add(@"\w*(o|e)vich.{0,2}");
            regexes.Add(@"\w*(о|є)віч.{0,2}");//
            regexes.Add(@"lang-uk");//

            foreach (string strRx in regexes) 
            {
                Regex rx = new Regex(strRx);
                MatchCollection coll = rx.Matches(rbDst.Text);
                RichTextBox controlToSelect = rbDst;
                foreach (Match m in coll)
                {
                    controlToSelect.Select(m.Index,
                            m.Length);
                    controlToSelect.SelectionBackColor = Color.LightBlue;

                    
                }
            }

        }


        private static void UlifTest()
        {
            /*
            UlifPhraseologicalDictionary dic = new UlifPhraseologicalDictionary();
            Translate.Result  ulifRes = dic.Translate("червоний", dic.SupportedTranslations[0], dic.SupportedSubjects[0], new NetworkSetting());

            Translate.Result r1 = ulifRes.Childs[0];
            Translate.Result r2 = ulifRes.Childs[0];
             */

            
            
            var morph = new ru.morpher3.MorpherSoapClient();            
            

            //string [] str5 = morph.GetAll5("власти");
            string[] strForms = morph.GetForms("власть");
            string[] strForms2 = morph.GetForms("египетская");

            //GwebSearchClient gweb = new GwebSearchClient("Sasha");
            //IList<IWebResult> res = gweb.Search("червоний", 10);

            
            
            /*
            //it works!!!
            bool r;
            dictlib lib5 = new dictlib(@"G:\Program Files\ILIR\Dictionaries of Ukraine 3.2\dict\");            
            byte[] buf = lib5.GenerateWPar("червоний", 15, "style2_3.css", gldescript.gldesc.dic.INFL_DIC);
            //   
            */
        }
        

        string MarkDelimitations()
        {
            List<int> positions = new List<int>();
            RichTextBox controlToSelect = rbDst;

            int foundIndex = 0;
            int offset = 0;
            do
            {
                if(foundIndex>0)
                {
                    positions.Add(foundIndex-offset);
                    offset++;
                //controlToSelect.Select(foundIndex,2);
                //controlToSelect.SelectionBackColor = Color.FromArgb(255, 128, 64);

                }

                foundIndex = controlToSelect.Text.IndexOf(TranslationTools.blockMarker, foundIndex + 1);
            } while (foundIndex != -1);
            controlToSelect.Text = controlToSelect.Text.Replace(TranslationTools.blockMarker, "");

            MarkDelimitations(positions);

            return controlToSelect.Text;
            //string rtf = controlToSelect.Rtf;
            //rtf = rtf.Replace(blockMarker,""); 
            //controlToSelect.Rtf = rtf;
        }

        void MarkDelimitations(List<int> positions)
        {
            RichTextBox controlToSelect = rbDst;
            int count = 0;
            for (int i = 0; i < positions.Count; i++)
            {
                controlToSelect.Select(positions[i],
                            1);


                controlToSelect.SelectionBackColor = Color.Bisque;
            }
        }

        public string SeparateWikiLinks(string text)
        {
            Page p = new Page();
            p.text = text;

            Site site = RuSite;
            
            MatchCollection matches = site.wikiLinkRE.Matches(text);
            StringCollection exclLinks = new StringCollection();
            exclLinks.AddRange(p.GetInterWikiLinks());
            exclLinks.AddRange(p.GetSisterWikiLinks(true));
            StringCollection inclLinks = new StringCollection();
            string str;
            for (int i = matches.Count -1 ; i >=0; i--) 
                if (exclLinks.Contains(matches[i].Groups[1].Value) == false &&
                    exclLinks.Contains(matches[i].Groups[1].Value.TrimStart(':')) == false)
                {//groups [0] whole link; Groups[1] - the concrete link; 
                    //Groups[2] link text
                    str = matches[i].Groups[1].Value;
                    
                    //if (str.IndexOf("#") != -1)
                    //    str = str.Substring(0, str.IndexOf("#"));

                    if (matches[i].Groups[2].Value != "")
                    {
                        int start = matches[i].Groups[1].Index;
                        text = text.Remove(start ,
                            text.LastIndexOf('|', start) -
                            start - 1);
                        inclLinks.Add(str);
                    }
                }

            return "";
        }

        void bg_DoWork(object sender, DoWorkEventArgs e)
        {
            throw new NotImplementedException();
        }

        public void Experiment()
        {
            Google.API.Translate.TranslateClient client = new TranslateClient(@"http://code.google.com/p/google-api-for-dotnet/");
            //lblMessage.Text = rbSrc.Text.Length.ToString();            

            string firstSrc = @"{{Нет карточки|Гимн}}
C 1957 по [n] 1994 год '''гимном''' [[ЮАР]] была песня ''Die Stem van Suid-Afrika'' ([[африкаанс]]: «Голос Южной Африки»), написанная в 1918 ''году''.

в качестве гимна использовалась «[[Ода к ''радости'']]» [[Людвиг ван Бетховен|Людвига ван Бетховена]].

После 1994 года в употребление наряду с ''Die Stem van Suid-Afrika'' вошёл неофициальный гимн АНК ''Nkosi Sikelel' iAfrika'', а в 1997 году была принята нынешняя «гибридная» версия: первые два куплета взяты из ''Nkosi Sikelel' iAfrika'' (первый куплет — на [[Коса (язык)|коса]] и [[язык зулу|зулу]], второй — на [[сесото]]), третий — первый куплет ''Die Stem'' на [[африкаанс]]....

== Текст гимна ЮАР с 1997 года ==
{|
|
Услышь наши прошения,<br />
Господи, благослови нас, детей своих.
|-";
            string src = rbSrc.Text;
            //src = firstSrc;
            src += src += src ;
            
            
            string backTranslation;

            src = TranslationTools.MakeReplacing(src, new List<ReplacingPair>(), true);


            rbDst.Text = src;
            
            
            src = src.Remove(500 - 1);
            
             //string ukrainian =  
                 //client.Translate(
                //src, GooLanguage.Russian, GooLanguage.Ukrainian, TranslateFormat.Text);
            string ukrainian;

            GoogleTranslator transGoo = new GoogleTranslator();
            var gooResult = transGoo.Translate(src,
                new LanguagePair(LanguageTr.Russian, LanguageTr.Ukrainian),
                "Common", new NetworkSetting());
            ukrainian = gooResult.Translations[0];

             //ukrainian = HttpUtility.HtmlDecode(ukrainian);
             rbDst.Text = ukrainian;
            //rbBackTransform.Text = MakeReplacing(rbDst.Text, new List<ReplacingPair>(), false);
            backTranslation = client.Translate(
                rbDst.Text, GooLanguage.Ukrainian, GooLanguage.Russian);
            backTranslation = TranslationTools.MakeReplacing(backTranslation, new List<ReplacingPair>(), false);

            
            
            //backTranslation = @"{{ Ни карты | Гимн }} C 1957 по 1994 год ''' гимном ''' [[Южная Африка]] была песня '' Die Stem van Suid-Afrika '' ([[африкаанс]]: «Голос Южной Африки»), написанная в 1918 '' году ''. как гимн использовалась «[[Ода к '' радости '']]» [[Людвиг ван Бетховен | Людвига ван Бетховена]]. После 1994 года в употребление наряду с '' Die Stem van Suid-Afrika '' вошел неофициальный гимн АНК '' Nkosi Sikelel 'iAfrika '', а в 1997 году была принята нынешняя «гибридная» версия: первый д";
            rbDstPere.Text = backTranslation;

            PereOrgUATranslator trans = new PereOrgUATranslator();
            var result = trans.Translate(firstSrc,
                new LanguagePair(LanguageTr.Russian, LanguageTr.Ukrainian),
                "Common", new NetworkSetting());
            
            rbDstPere.Text = result.Translations[0];

            SelectDifferentWords(src, rbDstPere.Text,rbDstPere);
        }

        public void SelectDifferentWords(string src, string compared, RichTextBox controlToSelect)
        {
            controlToSelect.Select(0,
                            10);
            controlToSelect.SelectionBackColor = Color.White;

            try
            {
                Regex regexObj = new Regex(@"\b(?:\w)+\b");
                Match matchResultsSrc = regexObj.Match(src);
                Match matchBackTranslation = regexObj.Match(compared);
                var backTransMatches = regexObj.Matches(compared);
                int i = 0;
                int z = 0;
                while (matchResultsSrc.Success && backTransMatches.Count>i)
                {
                    
                    // matched text: matchResults.Value
                    // match start: matchResults.Index
                    // match length: matchResults.Length
                    if (matchResultsSrc.Value != backTransMatches[i].Value)
                    {

                        int offset = GetWordOffSet(backTransMatches, i, matchResultsSrc.Value);
                        i += offset;
                        if (matchResultsSrc.Value == backTransMatches[i].Value)
                            continue;

                        controlToSelect.Select(backTransMatches[i].Index,
                            backTransMatches[i].Length);

                        controlToSelect.SelectionBackColor = Color.Yellow;
                        

                        //rbBackTransform.Select(0, 2);
                        //rbBackTransform.SelectionBackColor = Color.Yellow;
                    }

                    matchResultsSrc = matchResultsSrc.NextMatch();
                    //matchBackTranslation = matchBackTranslation.NextMatch();
                    i++;
                    
                    //if (i > 13)
                    //    break;
                    
                }
            }
            catch (ArgumentException )
            {
                // Syntax error in the regular expression
                MessageBox.Show("Test");
            }

        }

        int GetWordOffSet2(MatchCollection collection, int curIndex, string syncWord)
        {
            for (int offset = 0; offset <= 4; offset++)
            {
                int newIndex = curIndex + offset;
                if (newIndex <= collection.Count - 1 && newIndex > 0)
                {                    
                    if (collection[newIndex].Value == syncWord)
                        return offset;
                }

                newIndex = curIndex - offset;
                if (newIndex <= collection.Count - 1 && newIndex >= 0)
                {
                    if (collection[newIndex].Value == syncWord)
                        return offset;
                }
            }
            /*
            for (int offset = -2; offset <= 0; offset++)
            {
                int newIndex = curIndex + offset;
                if (newIndex <= collection.Count - 1 && newIndex > 0)
                {
                    if (collection[newIndex].Value == syncWord)
                        return offset;
                }
            }*/
            return 0;
        }

        int GetWordOffSet(MatchCollection collection, int curIndex, string syncWord)
        {
            for (int offset = 0; offset <= 4; offset++)
            {
                int newIndex = curIndex+offset ;
                if (newIndex <= collection.Count - 1 && newIndex>0)
                {
                    if (collection[newIndex ].Value == syncWord)
                        return offset;
                }
            }
            
            for (int offset = -2; offset <= 0; offset++)
            {
                int newIndex = curIndex + offset;
                if (newIndex <= collection.Count - 1 && newIndex > 0)
                {
                    if (collection[newIndex].Value == syncWord)
                        return offset;
                }
            }
            
            return 0;
        }

        public void CheckWordComparing()
        {
            string gooResult = @"  Виверження цього [[Вулкан (геологія) | вулкана]] в [[1815]] - найбільше за всю сучасну історію за обсягом вивержених матеріалу (до 150-180 куб. км. пірокластікі і газів), кількості людських жертв (безпосередньо під час виверження загинуло близько 10000 чоловік, від 50000 до 80000 померло від голоду і хвороб внаслідок виверження) і глобального впливу на клімат Землі, єдине історичне виверження з коефіцієнтом експлозівності 7. В результаті виверження була повністю знищена розвинена [[культура Тамбора]], тривалий час існувала на острові. 
Останнім виверженням, порівнянними або перевершує за силою виверження 
Тамбора, за оцінками геологів, було виверження вулкана в Новій Зеландії 
близько 27 тис. років тому, в результаті якого 
утворилося озеро [[Таупо (озеро) | Таупо]]. 
";

            string pereResult = @"Извержение цього [[Вулкан (геологія)|вулкана]] в [[1815]] — найбільше за сучасну історію за обсягом изверженного матеріалу (до 150—180 куб. км. пирокластики і газів), кількості людських жертв (безпосередньо при виверженні загинуло близько 10000 людина, від 50000 до 80000 померли від голоду й хвороб внаслідок виверження) і глобальному впливу на клімат Землі, єдине історичне виверження з коефіцієнтом эксплозивности 7. Через війну виверження повністю знищена розвинена [[культура Тамбора]], тривалий час існувала на острові.
Останнім виверженням, порівнянним чи котрий перевершував за силою виверження 
Тамборы, за оцінками геологів, було виверження вулкана у Новій Зеландії 
близько 27 тис. років тому вони, у результаті якого утворилося 
озеро [[Таупо (озеро)|Таупо]].";

            //rbDst.Text = gooResult;
            //rbDstPere.Text = pereResult;
            rbDst.Text = "робочого середовища.";
            rbDstPere.Text = " робочого середовища .";

            DiffTwo();
            
            
        }

        private void CheckComparingOfInserted(ref string gooResult, ref string pereResult)
        {
            gooResult = @"{{ Картка компанії 
| Назва = Кіностудія «FILM.UA» 
| Логотип = [[Файл: Logo_black.jpg | 200px | Логотип компанії]] 
| Заснована = [[2002]] 
| Розташування = [[Київ]] 
| Тип = 
| Ключові фігури = 
| Галузь = [[кінематограф]] 
| Продукція = фільми, телесеріали, телевізійні програми. 
| Сайт = [http://www.film.ua/ru/ Офіційний сайт «FILM.UA»] 
}}
'''« FILM.UA »(ФІЛЬМ Ю ЕЙ )''' - одна з найбільших кіностудій Україні. 

== Кіностудія FILM.UA == 

Кіностудія FILM.UA була створена в листопаді 2002 року і на сьогодні впевнено займає позиції найбільшого виробника кінопродукції в Україні. У березні 2007 року перетворилася на комплексну кіногрупу FILM.UA Group. Сьогодні кіногрупа має всі ресурси для реалізації повного циклу телепроекту: від його виробництва до продажу на ринку на будь-яких носіях. 

У структурі групи є кілька дочірніх компаній: 
* FILM.UA Production 
* FILM.UA Television 
* FILM.UA Distribution 
* FILM.UA Studio та інші. 

== Структура == 
''' Film.UA Production ''' - виробнича компанія, що випускає телевізійні фільми і серіали. На сьогоднішній день продакшн-бібліотека кінокомпанії налічує більше 600 годин телепродукту. 

Серед проектів кінокомпанії: 
* телефільми «Там, де живе любов» (2006), «Бомж» (2006), «Мій принц» (2006), «Повернути Віру» (2006), «Вихід» (2008), «Тяжіння» (2008), « Таємничий острів »(2009) та ін; 
* Міні-серіали «Полювання на Вервольфа» (2008), «Третього не дано» (2009), «Абонент тимчасово недоступний» (2008), [[Паршиві вівці (фільм) | «Паршиві вівці» (2010)]]; 
* Теленовели «Серцю не накажеш» (2007), «Територія краси» (2009), «Сусіди» (2010). 

''' Film.UA Television ''' - продакшн-підрозділ групи, що займається виробництвом телевізійних програм. В активі компанії - програми «Давай одружимося» (2009-2010, українська версія), «Судові справи» (2008-2010, український ТК «Інтер»), «Містичні історії з Павлом Костіциним» (2010 р., український ТК СТБ ), «Помилаандерсен» (2010, за форматом Zodiac «Sexy Car Wash» для українського телеканалу ICTV) та ін. 

''' Film.UA Distribution ''' - дистрибуційна компанія, що займається реалізацією всіх видів прав на всі території. Бібліотека компанії налічує більше тисячі годин різножанрового продукту: теле-і кінофільми, серіали, теленовели, документальні проекти, мюзикли. Компанія розміщує як український продукт на зовнішні ринки, так і продукцію світових виробників на українському ринку. 

''' Film.UA Studio ''' - повномасштабна кіностудія в межах міста Києва, що володіє власними виробничими потужностями і цілої інфраструктурою, необхідною для бездоганного обслуговування процесу кіновиробництва. FILM.UA Studio має в своєму розпорядженні п'ять павільйонів для зйомки: два по 900 м ?, два по 800 м ? і невеликий павільйон на 200 м ?. Три павільйони знаходяться в стадії будівництва (300 м ?, два по 1000 м ? з висотою стелі не менше 14 м). У павільйонах кіностудії знімалися такі великі телевізійні шоу як перша «Фабрика зірок» (2007, українська версія, «Новий канал»), «Битва екстрасенсів» (2007-2008, українська версія, ТК «СТБ»), «Велика різниця» (2009, ТК « ICTV ») і ін 

== Загальна інформація == 
FILM.UA Group пропонує ринку, як комплексні послуги (т. зв. Здача проекту під ключ»), так і кожну послугу окремо: оренда павільйонів і техніки, здійснення виробничого процесу, послуги з дистрибуції продукту і т. д. На FILM.UA Studio розташувалися офіси не тільки компаній групи, а й інших лідерів українського кіноринку: «Kodak Cinelab», «Операторські Технології», «Саламандра». Таким чином, на кіностудії FILM.UA утворився так зване «містечко» українського кіно- і телевиробництва. 

Фільми, зняті кінокомпанією, успішно виходять в українському і російському ефірі. Більшість телефільмів набирають показники частки і рейтингу вище середніх показників каналів. Наприклад, показ телефільму «Там, де живе любов» 7 січня 2008 року зібрав на «Першому каналі» (Росія) частку 33,3 за цільовою аудиторією каналу і став ПЕРШИМ в рейтингу телевізійних фільмів російського ефіру 2008 року. 9 травня 2009 прем'єра міні-серіалу «Полювання на Вервольфа »на українському каналі ICTV вивела канал на перше місце в прайм-таймі по аудиторії 14-49, подвоївши середні показники каналу. Фільм «Моя старша сестра» став кращою телепрограмою каналу «ТВ-Центр» в першу, новорічну тиждень 2010 року. 

Права на фільми також продаються в країни на всіх п'яти континентах Щорічно дистрибуційна компанія FILM.UA приймає участь у провідних телеринках Європи та світу: MIP COM і MIP TV в Каннах, Moskow Teleshow в Москві, DISCOP в Будапешті, AFM (Лос Анжелес). 

== Посилання == 
* [http://www.film.ua/ru/ Офіційний сайт кінокомпанії «Film.ua» (Фільм. Ю. Ей)] 

[[Категорія: Кінокомпанії України]] ";

            pereResult = gooResult;
            for (int i = gooResult.Length; i > 0; i -= 25)
            {
                pereResult = pereResult.Insert(i, "ЯЯ ");
            }

            rbDst.Text = gooResult;
            rbDstPere.Text = pereResult;

            DiffTwo();
        }


        public void TranslateEsoteric()
        {
            //GoogleTranslationAPI.GoogleTranslator trans =
              //  new GoogleTranslator(rbSrc.Text, VERSION.ONE_POINT_ZERO, (LANGUAGE)Language.Russian, (LANGUAGE)Language.Ukrainian, "my key");
                
        }
        public void TranslateAlex()
        {
            rbDst.Text = TranslateText(
                //rbSrc.Text,
                "перевод текста - очень сложная задача",
                "ru|uk");
        }

        /// <summary>
        /// Translate Text using Google Translate API's
        /// Google URL - http://www.google.com/translate_t?hl=en&ie=UTF8&text={0}&langpair={1}
        /// </summary>
        /// <param name="input">Input string</param>
        /// <param name="languagePair">2 letter Language Pair, delimited by "|".
        /// E.g. "ar|en" language pair means to translate from Arabic to English</param>
        /// <returns>Translated to String</returns>
        public string TranslateText(string input, string languagePair)
        {

            string url = String.Format("http://www.google.com/translate_t?hl=en&ie=UTF8&text={0}&langpair={1}", input, languagePair);

            WebClient webClient = new WebClient();

            webClient.Encoding = System.Text.Encoding.Unicode;
            

            string result = webClient.DownloadString(url);

            //result = result.Substring(result.IndexOf("id=result_box") + 22, result.IndexOf("id=result_box") + 500);
            result = result.Substring(result.IndexOf("id=result_box") + 24, 800);

            result = result.Substring(0, result.IndexOf("</div"));

            return result;

        }

        private void btnTranslate_Click(object sender, EventArgs e)
        {
            Translate();
        }

        private void txbSource_TextChanged(object sender, EventArgs e)
        {

        }

        private void btnLoadAndTranslate_Click(object sender, EventArgs e)
        {
            LoadAndTranslate();
        }

        Stopwatch watch = new Stopwatch();

        private void LoadAndTranslate()
        {
            watch.Reset();
            watch.Start();
            LoadPage();
            Translate();
        }

        private void rbSrc_VScroll(object sender, EventArgs e)
        {
            //rbSrc.AutoScrollOffset = rbDst.AutoScrollOffset;

            

            
        }

        private void rbDst_TextChanged(object sender, EventArgs e)
        {
            
        }

        [DllImport("user32")]
        public static extern int GetScrollPos(IntPtr hWnd, int nBar);
        
        [DllImport("user32", EntryPoint = "SendMessageA")]
        public static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, IntPtr lParam);
        const int SB_THUMBPOSITION = 4;
        const int SB_VERT = 1;
        const int WM_VSCROLL = 0x0115;


        private void rbDst_VScroll(object sender, EventArgs e)
        {
            //rbSrc.AutoScrollOffset = rbDst.AutoScrollOffset;

            int pos = GetScrollPos(((Control)sender).Handle, SB_VERT);
            SendMessage(rbSrc.Handle, WM_VSCROLL, (pos << 16) | SB_THUMBPOSITION, IntPtr.Zero);
            SendMessage(rbDstPere.Handle, WM_VSCROLL, (pos << 16) | SB_THUMBPOSITION, IntPtr.Zero);
        }

        private void btnCheckPage_Click(object sender, EventArgs e)
        {
            FindSimilarArticles(txbDstPage.Text);
        }

        private void btnPublish_Click(object sender, EventArgs e)
        {
            Page page = new Page(UkSite, txbDstPage.Text);            
            page.Load();            
            
            //watch.Stop();
            Directory.CreateDirectory(statFolder);
            File.AppendAllText(statFolder+ "TranslationTime.txt", string.Format("'{0}' was translated in {1} \n", page.title, watch.Elapsed), Encoding.Unicode);

            if (!string.IsNullOrEmpty(page.text))
            {
                if (MessageBox.Show("This page already exists. Are you sure you want to publish it?!", "Exists!", MessageBoxButtons.OKCancel)
                    == DialogResult.Cancel)
                    return;
            }

            string textToSave = rbDst.Text; // cross threading operations 
            if (replaceLinksWithText && textToSave.Contains(TextTools.linksSeparationMarker))
            {
                textToSave = TextTools.BackReplacementLinksWithText(textToSave);
            }
            string time = (int)watch.Elapsed.TotalMinutes + "." + watch.Elapsed.Seconds;
            double ratio = CalculateSizeAndRatio();
            string comment = string.Format("/*{0}/{1}*/", time, ratio);

            // origName; time; size; ratio; uksize, ukName, dateTime
            string stat = string.Format("{0};{1};{2};{3};{4};{5};{6}",
                txbSrcPage.Text, watch.Elapsed.ToString(), rbSrc.Text.Length,
                ratio, rbDst.Text.Length, txbDstPage.Text,DateTime.Now.ToString());

            File.AppendAllText(statFolder+"ratio.txt", stat, Encoding.Unicode);

            ((Action)delegate
            {
                

                page.Save(textToSave, comment, false);
                page.Watch();
                

                Page translatedPages = new Page(UkSite, "Користувач:Alex Blokha/" + "CreatedPages");
                translatedPages.Load();
                string realPage_Name = "";

                if(page.title.Contains("Користувач:Alex Blokha/"))
                {
                    realPage_Name = page.title.Split('/')[1];
                }
                else
                    realPage_Name = page.title;

                if(!translatedPages.text.Contains(realPage_Name))
                {
                    translatedPages.text+= "[["+realPage_Name+"]]\n";
                }                
                
                translatedPages.Save("+1",false);

            }).BeginInvoke(null,null);


            btnSaveTranslation_Click(sender, e);
        }

        private void tmrTimer_Tick(object sender, EventArgs e)
        {
            lblTimeTaken.Text = watch.Elapsed.ToString();
            CalculateSizeAndRatio();
        }

        private void btnSaveTranslation_Click(object sender, EventArgs e)
        {
            string compatibleName = new string(txbSrcPage.Text.ToCharArray().
                Where(c => !Path.GetInvalidFileNameChars().Contains(c)).
                ToArray());
            string fileNameTemplate = AppDomain.CurrentDomain.BaseDirectory+ @"TranslationPairs\{0}_{1}.txt";
            string ruName = string.Format(fileNameTemplate,"ru",
                compatibleName);

            Directory.CreateDirectory("TranslationPairs");

            string ukrName = string.Format(fileNameTemplate, "ukr",
                compatibleName);

            if (File.Exists(ruName) && File.ReadAllText(ruName) != rbSrc.Text)
            {
                if (MessageBox.Show("Src text in exisitng file is different. Are you sure you want to rewrite language pair for " + txbSrcPage.Text, "Sure?", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    File.WriteAllText(ruName, rbSrc.Text, Encoding.Unicode);
                    File.WriteAllText(ukrName, rbDst.Text, Encoding.Unicode);
                }
            }
            else
            {
                       File.WriteAllText(ruName, rbSrc.Text, Encoding.Unicode);
                       File.WriteAllText(ukrName, rbDst.Text, Encoding.Unicode);
            }
            CalculateSizeAndRatio();
        }

        private double CalculateSizeAndRatio()
        {
            rbDst.Invoke(
            (Action) delegate() { lblSizeValue.Text = rbDst.Text.Length.ToString(); }
            );
            if(watch.Elapsed.TotalMinutes>=1)
            {
                double ratio = ((rbDst.Text.Length/1024) / watch.Elapsed.TotalMinutes);
                tsRatio.Text = "Ratio:"+ratio.ToString("00.00")+"Kb/min";

                return ratio;
            }
            return 0;
        }

        private void tbtnDiff_Click(object sender, EventArgs e)
        {
            DiffTwo();
        }
        
        public static Dictionary<string, string> GetWordsWithRod()
        {
            ulif.dictlib service = UlifHelper.GetService(new NetworkSetting());
            UlifHelper.CheckVersion(service);
            bool found;
            bool SearchWordResultSpecified;
            bool rSpecified;
            int word_idx;
            
            Dictionary<string,string> list = new Dictionary<string,string>();

            for(int i=0;i<100;i++)
            {
                string word = service.ReestrGetWord(i, true);
                if (word != "")
                {
                    WordUniAndPartAndOmon[] words =
                    service.getAllFirstWFormsWithParts(word); // gives imennyk

                    if (words.Length>0 && words[0].part.Contains("іменник"))
                        list.Add(word, words[0].part);
                }
            }

            return list;
        }
        
        public static string GetSynonymsPage(string word)
        {
            ulif.dictlib service = UlifHelper.GetService(new NetworkSetting());
            UlifHelper.CheckVersion(service);
            bool found;
            bool SearchWordResultSpecified;
            bool rSpecified;
            int word_idx;

            string str;

            WordUniAndPartAndOmon[] words = 
                service.getAllFirstWFormsWithParts(word); // gives imennyk

            byte[] res = new byte[400];
            service.getAllPart(word, out found, out SearchWordResultSpecified,
                out res);
            str = service.getcwf(word);

            string f6 = "", f7 = "";
            service.getsemcomm(1, true, out f6, out f7);



            service.SearchWord(word, gldescdic.SYN_DIC,
                true, true, true, out word_idx, out SearchWordResultSpecified,
                out found, out rSpecified);
            if (!found)
                return "";

            int word_uid;
            service.ReestrGetID(word_idx, true, gldescdic.SYN_DIC, true, true, true, out word_uid, out rSpecified);
            




            return service.DictPrepare2(word_uid, true, "", "style2_2.css", gldescdic.SYN_DIC, true, true, true);
        }

        private void toolStripDropDownButton1_Click(object sender, EventArgs e)
        {
            rbDst.SelectionBackColor = Color.Pink;
            rbDst.DeselectAll();
        }

        private void tsbUnknownWords_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("notepad.exe",configFolder+@"UntranslatedWords.txt");
        }

        private void tsbCompositeWords_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("notepad.exe",
                WordsDividerFile.FilePath);
        }

        private void tsbBufer_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("notepad.exe", configFolder + @"Buffer.txt");
        }

        private void tsbDirectory_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("explorer.exe", AppDomain.
                CurrentDomain.BaseDirectory);

            //System.Diagnostics.Process.Start(AppDomain.
            //    CurrentDomain.BaseDirectory);
        }

        private void label4_Click(object sender, EventArgs e)
        {

        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            rbDst.SelectedText = "[[" + rbDst.SelectedText + "]]";
        }

        private void tsOpenPage_Click(object sender, EventArgs e)
        {
            OpenPage(txbDstPage.Text);
            
        }

        

        private void tsComment_Click(object sender, EventArgs e)
        {
            rbDst.SelectedText = "<!--" + rbDst.SelectedText + "-->";
        }

        private void tsInterwiki_Click(object sender, EventArgs e)
        {
            rbDst.SelectedText = "[[ru:"+txbSrcPage.Text+"]]";
        }

        private void tsMatchRedLinks_Click(object sender, EventArgs e)
        {
            /*
            int beginIndex;
            List<string> linksArr = new List<string>();
            try
            {
                TextTools.GetUnprocessedLinksArray(rbDst.Text, out beginIndex, out linksArr);
            }
            catch (IndexOutOfRangeException)
            {
            }
            */
            

            string pageFullText = TextTools.BackReplacementLinksWithText( rbDst.Text);
            Page p = new Page(UkSite);
            p.title = "noPage";
            p.text = pageFullText;
            UkSite.GetWikimediaWikisList();
            PageList plist = p.GetLinks();

            LinksList l = new LinksList(plist, txbDstPage.Text);
            l.Show();

            
        }

        private void TestRedLinks()
        {
            List<string> linksArr = new List<string>();

            linksArr.Add("робочий клас");
            linksArr.Add("димова труба");

            foreach (string link in linksArr)
            {
                //MatchRedLink f = new MatchRedLink(link.Trim());
                //f.Show();
            }
        }

        private void toolStripButton1_Click_1(object sender, EventArgs e)
        {
            string textToSave = rbDst.Text;
            if (replaceLinksWithText && textToSave.Contains(TextTools.linksSeparationMarker))
            {
                textToSave = TextTools.BackReplacementLinksWithText(textToSave);
            }
            Clipboard.SetText(textToSave);
        }

        private void rbSimilarArticles_TextChanged(object sender, EventArgs e)
        {

        }

        private const int EM_LINEFROMCHAR = 0x00C9;

        private void rbSimilarArticles_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            int lineNumber = SendMessage(rbSimilarArticles.Handle,
                        EM_LINEFROMCHAR, -1, IntPtr.Zero);

            string [] lines =rbSimilarArticles.Text.Split(new char[] { '\n', '\r' },
                StringSplitOptions.RemoveEmptyEntries);

            if(lineNumber!=-1)
                OpenPage(lines[lineNumber]);
        }

        private void toolStripButton2_Click(object sender, EventArgs e)
        {
            TestMemoryStress();
        }
        
    }

    public class Result
    {
        public string resultStr;
        public List<int> delimiterPositions;
    }



    
}
